跳到主要内容

Linux 管理用户和用户组

常见 QA

全名和用户名的区别

用户名 是用来登陆 Linux 系统的

全名 只是对用户名的一个备注说明(就是显示在 Shell 的那个)

超管和普通用户的区别

超管:root(用户名就是root)

最开始创建的不是 root 用户,而是一个普通用户

日常维护工作使用普通用户完成,除非遇到系统管理的工作,使用 root 来完成

普通用户要用超管命令则前面加个 sudo 有5分钟的有效期,在有效期内使用 sudo 不需要再输入密码

如何查看有哪些用户在线

如果要看目前有谁在线上,可以下达 who 这个指令

who :查看当前登录用户信息

如果想看登录历史可以使用下面这个

who /var/log/wtmp

可以查看自从 wtmp 文件创建以来的每一次登陆情况(就是查看全部的登陆 ip 地址等)

  • -b:查看系统最近一次启动时间
  • -H:打印每列的标题

用户相关的命令

useradd 创建用户 ⭐

参考资料 ubuntu普通用户不能使用sudo

# 创建一个用户
sudo useradd 用户名
# 创建一个用户并将其加入到sudo用户组 ⭐
sudo useradd name -m -G sudo


# 直接创建用户并将其添加到组里面
# -c 参数是设置用户全名(就是备注)
sudo useradd -G mygroup1 -c "1 st user" myuser1

# 创建一个不能登陆的用户
# -s 参数:设置登陆后使用的终端
sudo useradd -c "this user can't login" -s /bin/nologin myuser3

参数

-m :默认创建的账户是没有 home 目录的 如果加上 -m 来创建才有 home 目录

sudo useradd -m user1

也可以通过 -d 命令指定这个用户的家目录

-e<有效期限>:指定帐号的有效期限。

-s<shell>:指定用户登入后所使用的shell。

-g:选择所在组(就是给用户分组)

sudo useradd -g 组名 用户名

可以通过 id 命令查看当前账户(这个组必须先存在)

id alsritter

# 输出
uid=1000(alsritter) gid=1000(alsritter) groups=1000(alsritter),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),114(netdev)

添加密码(不设置密码是无法用的)

sudo passwd 用户名

同理,超管也是需要设置了密码才能用

sudo passwd root

如果要改密码直接 passwd 就可以了

注意:ubuntu 普通用户不能使用 sudo,需要先把这个用户加入 sudo 组里面才能使用 sudo

sudo usermod -a -G sudo name
cat /etc/group

查看用户信息

id 查看id信息 或者 id username

whoami 当前登陆用户

who 罗列 当前登陆 的所有用户

imaged0cbcc6cc0068424.png

查看所有用户

$ cat /etc/passwd |cut -f 1 -d :

usermod 修改用户信息

得在 root 权限下使用这个命令,它的参数就和上面创建用户能用的参数一样

# 修改初始组(一般不改)
usermod -g xxgroup xxuser

# 修改附加组(注意是覆盖的,所以要保存之前的组则要全部写下来)
usermod -G xxgroup,xxgroup xxuser # 一般也不用这个命令,直接用上面的groupmems 命令就好了

# 修改 shell
usermod -s /bin/bash xxuser

# 重设 username 的密码。
passwd <username>


# 查看用户的信息

cat /etc/passwd

# 输出--------------------------------------------->

alsritter:x:1000:1000:alsritter_Ubuntu,,,:/home/alsritter:/bin/bash
user1:x:1001:1001::/home/user1:/bin/sh

# 第一个是用户名,
# 第二个是密码(默认是x显示),
# 第三个是UID,
# 第四个是GID,
# 第五个是全名,
# 第六个是home目录
# 第七个是使用的shell

passwd 修改用户密码

Linux passwd 命令用来更改使用者的密码

passwd [-k] [-l] [-u [-f]] [-d] [-S] [username]

必要参数:

-d 删除密码
-f 强迫用户下次登录时必须修改口令
-w 口令要到期提前警告的天数
-k 更新只能发送在过期之后
-l 停止账号使用
-S 显示密码信息
-u 启用已被停止的账户
-x 指定口令最长存活期
-g 修改群组密码
指定口令最短存活期
-i 口令过期后多少天停用账户

使用例

passwd alsritter  # 设置 alsritter 用户的密码
# Enter new UNIX password: # 输入新密码,输入的密码无回显
# Retype new UNIX password: # 确认密码
# passwd: password updated successfully
#

显示账号密码信息

imagef7c6ca09bcbe501f.png

su 用户的切换

su 用户名 用户切换

如果处于 root 用户则是输入 exit 退出用户 或者 ctrl+d

userdel 用户的删除

userdel 命令

删除用户:userdel 用户名

删除用户同时还删除其 home 目录:userdel -r 用户名

强制删除用户(当该用户还处于登陆状态也给删了):userdel -f 用户名

用户组相关命令

每个用户都有一个初始组(创建用户时会自动创建一个同名的组),可以有零个或多个附加组。用户组的作用,是为了方便权限控制

组与用户是多对多的关系

一个组有多个用户,一个用户属于多个组

  • 添加用户组:groupadd 组名
  • 查看所有组:cat /etc/group
  • 命名、改名:groupmod -n 新名称 原名称
  • 删除组:groupdel 组名

默认存在的用户组

root UID:      0 超级用户帐号,几乎没有任何约束并且不考虑其他所有的登陆,保护和许可;可以进入系统访问
daemon UID: 1 控制后台进程的系统帐号
bin UID: 2 管理大部分命令的帐号
sys UID: 3 管理许多系统文件的帐号
adm UID: 4 管理某些管理文件的帐号
lp UID: 71 打印服务帐号
smtp UID: 0 smtp邮件者使用简单网络管理协议。SMTP是INTERNET标准协议
uucp UID: 5 为UNIX-to-UNIX拷贝程序(UUCP)捆绑数据文件和目标的帐号
nuucp UID: 6 使用远程系统登陆到主机传送文件的帐号
listen UID: 37 网络监听帐号
nobody UID: 60001 匿名帐号,当独立于root用户建立一个需求时分派NFS服务器。nobody帐号分派软件进程时不需要任何特殊的权限。

groupmems 管理用户群组

语法:

groupmems [选项] [动作]

选项:

-g、--group groupname :超级用户可以指定修改哪个组的组成员列表 -R、--root CHROOT_DIR :chroot 到的目录 (搞不懂..)

动作:

-a, --add username :将用户 username 添加到组成员中 -d, --delete username :从组的成员中删除用户 username -h, --help :显示此帮助信息并推出 -p, --purge :从组中移除所有成员 -l, --list :列出组中的所有成员

基本操作组的指令 ⭐

sudo groupadd groupname # 创建组
sudo groupmod -n new_name old_name # 修改组名
sudo groupdel groupname # 删除组
sudo groupmems -g sudo -a git # 把 git 用户加入到 sudo 组里 ⭐

注意,修改组后要切换用户再切换回来刷新环境变量

su root             #切换到root用户
su ${USER} #再切换到原来的应用用户以上配置才生效(这个 ${USER} 是默认用户)
# 直接创建用户并将其添加到组里面
sudo useradd -G mygroup1 -c "1 st user" myuser1

修改文件用户组 chgrp

chgrp  组群       文件名  -R
# -R表示递归目录下所有文件

修改文件所属组群:chgrp 命令 修改文件所属组群很简单 chgrp 命令,就是 change group 的缩写

语法:

chgrp  组群  文件名/目录

使用示例

[root@redhat ~]# groupadd groupa
[root@redhat ~]# groupadd groupb
[root@redhat ~]# useradd   -g groupa zgz
[root@redhat ~]# su - zgz
[zgz@redhat ~]$ touch filea
[zgz@redhat ~]$ touch fileb
[zgz@redhat ~]$ ls -l
total 8
-rw-r--r--  1 zgz groupa 0 Sep 26 05:48 filea
-rw-r--r--  1 zgz groupa 0 Sep 26 05:50 fileb

[root@redhat zgz]# chgrp  groupb filea      --改变filea所属群组
[root@redhat zgz]# ls -l
total 8
-rw-r--r--  1 zgz groupb 0 Sep 26 05:48 filea
-rw-r--r--  1 zgz groupa 0 Sep 26 05:50 fileb

查看用户当前组

1、groups 命令法,groups 命令可以查看某个用户所属的用户组

  • 只执行 groups 命令,可以查看系统当前登录用户的所属组
  • groups alsritter, 查询特定用户的用户组,在 groups 后面跟用户名即可

2、通过 /etc/group 查看所有组

cat /etc/group # 查看所有组

# 输出----------------------------------------------------->

alsritter:x:1000:
sambashare:x:126:alsritter
user1:x:1001:

# 1. 组名
# 2. 组密码标志
# 3. GID
# 4. 组中附加用户

检查文件或者文件夹所处的组

ls -lh

给用户 root 权限

方法一: 修改 /etc/sudoers 文件,找到下面一行,把前面的注释(#)去掉

## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL #去掉这个注释

然后修改用户,使其属于 root组(wheel),命令如下:

usermod -g root alsritter

修改完毕,现在可以用 alsritter 帐号登录,然后用命令 su – ,即可获得 root 权限进行操作。

方法二: 修改 /etc/sudoers 文件,找到下面一行,在 root 下面添加一行,如下所示:

## Allow root to run any commands anywhere
root ALL=(ALL) ALL
alsritter ALL=(ALL) ALL

注意显示只读使用 !wq 退出

使用测试

# 先使用 alsritter 用户创建一个文件夹
touch testdir
# 创建一个组
sudo groupadd testgroup
# 让其位于这个组
sudo groupmems -g testgroup -a alsritter
# 检查是否进入了这个组
groups alsritter
# alsritter : alsritter adm dialout cdrom floppy sudo audio dip video plugdev netdev docker testgroup

# 创建新用户,并将其加入组中
sudo useradd testuser -G testgroup
# 或者使用 usermod -g wang test # 创建用户test,并将其加入到用户组 wang 中
sudo passwd testuser
# 123456
su testuser
# 先检查组
groups testuser
# testuser : testuser testgroup

# 检查目录的权限
# drwxr-xr-x 2 root root 4096 6月 22 09:46 test
# 可见,同组的成员只有 rx 权限

然后尝试删除

# 检查文件组
ls -lh
# drwxrwxr-x 2 root root 4.0K 6月 22 09:46 test
# 发现是 root 组的,所以得把它换成自定义的那个组
sudo chgrp testgroup test -R

# 然后别忘了给这个目录添加权限
sudo chmod -R g+w test # w   可以修改文件夹内文件(可以删除,新增文件、文件夹)
# 再次检查
ls -lh
# drwxrwxr-x 2 root testgroup 4.0K 6月 22 09:46 test
# 再次删除测试
rm -r test

依旧无法删除

修改文件夹所有者

# chown [-R] 账号名称:组群  文件/目录
sudo chown -R testuser:testgroup test

这里记录一些常用的操作

管理用户和用户组

某学校的同一导师带的课题组会分组,这些同一组的同学间必须要能够互相修改对方的数据文件,但是同时这些同学又需要保留自己的私密数据,因此直接公开家目录是不适宜的。

任务一:单纯的完成上头交代的任务,假设我们需要的账号数据如下,你该如何实作?规划如下的账户:

su root

groupadd mygroup1
# 注意:全名是对用户名的一个备注说明。
# -s 参数:设置登陆后使用的终端
useradd -G mygroup1 -c "1 st user" -s /bin/bash myuser1
useradd -G mygroup1 -c "2nd user" -s /bin/bash myuser2
# 创建一个不能登陆的用户
useradd -c "3rd user" -s /bin/nologin myuser3

# 更改用户的密码
# 这里 --stdin 来接收管道传入的,注意因为 Ubuntu 无法使用这个 stdin
# echo password | passwd --stdin user 更改为:
# echo user:pass | chpasswd

echo "password" | passwd --stdin myuser1
echo "password" | passwd --stdin myuser2
echo "password" | passwd --stdin myuser3

任务二:有三个人员 pro1, pro2, pro3 是同一个项目计划的开发人员,我想要让这三个用户在同一个目录底下工作, 但这三个用户还是拥有自己的家目录与基本的私有群组。假设我要让这个项目计划在 /srv/projecta 目录下开发, 该如何设置账户和组的信息?

su root

groupadd project
# 注意:全名是对用户名的一个备注说明。
# -s 参数:设置登陆后使用的终端
useradd -G project -c "1st user" -s /bin/bash pro1
useradd -G project -c "2nd user" -s /bin/bash pro2
useradd -G project -c "3rd user" -s /bin/bash pro3

# 更改用户的密码
# 这里 --stdin 来接收管道传入的,注意因为 Ubuntu 无法使用这个 stdin
# echo password | passwd --stdin user 更改为:
# echo user:pass | chpasswd

echo "password" | passwd --stdin pro1
echo "password" | passwd --stdin pro2
echo "password" | passwd --stdin pro3

# 如果是 Ubuntu
# echo pro1:password | chpasswd
# echo pro2:password | chpasswd
# echo pro3:password | chpasswd

mkdir /srv/projecta
chgrp project /srv/projecta
chmod 2770 /srv/projecta
ll -d /srv/projecta